#include "linkqueue.h"

// 初始化空队列
linkqueue *init_queue(void)
{
    // 管理结构体
    linkqueue *q = calloc(1, sizeof(linkqueue));
    if(q != NULL)
    {
        q->front = NULL;
        q->rear  = NULL;
        q->size  = 0;
    }
    return q;
}

bool is_empty(linkqueue *q)
{
    return q->size == 0;
}

// 入队
void en_queue(linkqueue *q, list newnode)
{
    if(is_empty(q))
    {
        q->front = newnode;
        q->rear  = newnode;
    }
    else
    {
        q->rear->next = newnode;
        q->rear = newnode;
    }
    q->size++;
}

// 出队
bool out_queue(linkqueue *q, node **k)
{
    if(is_empty(q))
        return false;

    *k = q->front;
    q->front = q->front->next;
    (*k)->next = NULL;

    // 如果出队的节点是原队列中唯一的节点
    if(q->front == NULL)
        q->rear = NULL;

    q->size--;
    return true;
}

// 检测给定的节点是否存在于队列中
bool find(linkqueue *q, int data)
{
    if(is_empty(q))
        return false;

    for(list p=q->front; p!=NULL; p=p->next)
    {
        if(p->data == data)
            return true;
    }
    return false;
}

list new_node(int data)
{
    list newnode = calloc(1, sizeof(node));
    if(newnode != NULL)
    {
        newnode->data = data;
        newnode->next = NULL;
    }
    return newnode;
}